package sysTask

import (
	"context"
	"donkey-admin/internal/consts"
	"donkey-admin/internal/dao"
	"donkey-admin/internal/model/do"
	"donkey-admin/internal/model/entity"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gtime"
	"github.com/google/uuid"
	"time"
)

type SysTaskLogService struct {
}

var SysTaskLogServiceApp = new(SysTaskLogService)

// CreateTaskLogByTask 根据sysTask创建任务日志
func (sysTaskLogService *SysTaskLogService) CreateTaskLogByTask(ctx context.Context, sysTask entity.SysTask, status consts.SysTaskStatus) (string, error) {
	uuidText := uuid.New().String()
	_, err := dao.SysTaskLog.Ctx(ctx).Insert(do.SysTaskLog{
		Uuid:           uuidText,
		TaskId:         sysTask.Uuid,
		TaskName:       sysTask.TaskName,
		CronExpression: sysTask.CronExpression,
		InvokeTarget:   sysTask.InvokeTarget,
		Timeout:        sysTask.Timeout,
		StartTime:      gtime.Now(),
		EndTime:        gtime.Now(),
		Status:         int(status),
	})
	if err != nil {
		g.Log().Error(ctx, err)
		return "", err
	}
	return uuidText, err
}

// UpdateTaskLogByTaskResult 更新任务日志
func (sysTaskLogService *SysTaskLogService) UpdateTaskLogByTaskResult(ctx context.Context, taskLogId string, taskResult SysTaskResult) (int64, error) {
	var status consts.SysTaskStatus
	result := taskResult.Result
	if taskResult.Err != nil {
		status = consts.Failure
	} else {
		status = consts.Finish
	}

	update, err := dao.SysTaskLog.Ctx(ctx).Where("uuid", taskLogId).Update(g.Map{
		"retry_times": taskResult.SysTaskLog.RetryTimes,
		"status":      status,
		"result":      result,
		"end_time":    time.Now(),
		"total_time":  time.Now().Sub(taskResult.SysTaskLog.StartTime.Time).Seconds(),
	})
	if err != nil {
		return 0, err
	}
	affected, err := update.RowsAffected()
	if err != nil {
		return 0, err
	}
	// 返回影响的行数
	return affected, nil
}
